
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.mystd.all;

entity ControlUnit is 
    port (
    	clk			: in std_logic;		-- signal takta
    	reset       : in std_logic;		-- RESET signal
        
    	branch      : in std_logic;		-- signal koji nam sluzi za azuriranje brojaca
        								-- i citanje nove vrednosti iz KMBRANCH
    	brop		: in std_logic;		-- signal koji nam sluzi za azuriranje brojaca
        								-- i citanje nove vrednosti iz KMOP
    	kmbranchOUT : in bus8;			-- vrednost iz KMBRANCH			
    	kmopOUT		: in bus8;			-- vrednost iz KMOP	 

		interrupt	: in std_logic;		-- linija koja se dovodi iz ALU bloka - greska u ilegalnoj instrukciji
		opcode		: in bus6;			-- potrebno zbog HALT instrukcije
    	counterValue: out bus8;			-- vrednost brojaca	
    	
    	-- rtl_synthesis off
    	prekid		: out std_logic		-- za simulaciju - procesor zaustavljen - ne ulazi u sintezu
    	-- rtl_synthesis on									
    ); 
end ControlUnit;     
        

architecture ControlUnit of ControlUnit is
  	signal cntValue: bus8;	-- vrednost brojaca
  	signal halt : std_logic;
begin  
	process
	begin
    
		wait until clk = '1';
        
		if(reset = '1') then
			-- reset ima najvisi prioritet
			cntValue <= X"00";
			halt <= '0';
        else
            
            if(halt = '0') then
    			if(branch = '1') then
    				-- ako dolazi do skoka, azuriramo brojac sa adresom skoka
    				-- iz bloka KMBRANCH
    				cntValue <= kmbranchOUT;
    			elsif(brop = '1') then
    				-- ako je u pitanju korak u kojem se dekoduje instrukcija
    				-- skacemo na adresu u sekvenci koraka, u kome se
    				-- trenutna instrukcija obradjuje
    				cntValue <= kmopOUT;
    			else
    				-- u suprotnom brojac koraka se samo inkrementira
    				cntValue <= bus8(unsigned(cntValue) + 1);
    			end if;
    		end if;
    		
    		if (cntValue = X"2D" AND interrupt = '1') then
    			halt <='1';
    		end if;
    		
    		if (cntValue = X"2C" AND opcode = HALTinstr) then
    			halt <='1';
    		end if;
    		
		end if;
	end process;

	counterValue <= cntValue;
	
	-- rtl_synthesis off
	prekid <= halt;
	-- rtl_synthesis on
		
end ControlUnit;








